/*
 * To change this template, choose Tools | Templates
 * AND open the template in the editor.
 */

package modelos;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author usuario
 */
public class ModeloProducto extends ModeloDB{

    private int id, id_categoria;
    private String descripcion,status;
    private float precio;

    public ModeloProducto(int id, int id_categoria, String descripcion, String status, float precio) {
        super();
        this.id = id;
        this.id_categoria = id_categoria;
        this.descripcion = descripcion;
        this.status = status;
        this.precio = precio;
    }
    
    public ModeloProducto(){
            super();
    }

    public boolean registar(){
        conectar();
        int cantidad = contarRegistros("Producto");
        String sql="INSERT INTO Producto (id, id_categoria, descripcion, precio , status ) VALUES(?,?,?,?,?)";
        PreparedStatement stam = crearPreparedStatement(sql);
        try {
            stam.setInt(1, getId());
            stam.setInt(2, getId_categoria());
            stam.setString(3, getDescripcion().toLowerCase());
            stam.setFloat(4, getPrecio());
            stam.setString(5, getStatus());
        } catch (SQLException ex) {
            Logger.getLogger(ModeloProducto.class.getName()).log(Level.SEVERE, null, ex);
        }
        boolean sw = ejecutarQueryPrepare(stam);
        desconectar();
        return sw;
    }
    

    public void registarIngredientes(Vector<String> ingredientes){
        conectar();
        int cantidad = contarRegistros("Producto");
        for (int i = 0; i < ingredientes.size(); i++) {
            String dato = ingredientes.elementAt(i);
            String sql="INSERT INTO IngredientexProducto (id_producto,id_ingrediente, porcion , status ) VALUES(?,?,?,'A')";
            PreparedStatement stam = crearPreparedStatement(sql);
            try {
                Vector<String> v = new Vector<String>();
                v.add(dato.substring(0, dato.indexOf("|")));
                v.add(dato.substring(dato.indexOf("|")+1,dato.length()));
                stam.setInt(1, getId());
                stam.setInt(2,Integer.parseInt(v.elementAt(0)));
                stam.setFloat(3, Float.parseFloat(v.elementAt(1)));
                ejecutarQueryPrepare(stam);
            } catch (SQLException ex) {
                Logger.getLogger(ModeloProducto.class.getName()).log(Level.SEVERE, null, ex);
            }
        }        
        desconectar();
    }

 public boolean eliminar(){
     conectar();
     String sql="UPDATE Producto SET status = 'E' WHERE id=?  AND status = 'A'";
     PreparedStatement stam = crearPreparedStatement(sql);
     try {
         stam.setInt(1, getId());
     } catch (SQLException ex) {
            Logger.getLogger(ModeloProducto.class.getName()).log(Level.SEVERE, null, ex);
     }
     boolean sw = ejecutarQueryPrepare(stam);
     desconectar();
     return sw;
 }

  public boolean actualizar(){
     conectar();
     String sql="UPDATE Producto SET precio=?  WHERE id=?  AND status = 'A'";
     PreparedStatement stam = crearPreparedStatement(sql);
     try {
         stam.setFloat(1, getPrecio());
         stam.setInt(2, getId());
     } catch (SQLException ex) {
            Logger.getLogger(ModeloProducto.class.getName()).log(Level.SEVERE, null, ex);
     }
     ResultSet rs = ejecutarQuery(stam);
     desconectar();
     return (rs==null);
 }

  public boolean  consultar(){
    boolean sw = false;
    conectar();
    String sql="SELECT * FROM Producto WHERE id=? AND status='A'";
    PreparedStatement stam = crearPreparedStatement(sql);
     try {stam.setInt(1, getId());
     } catch (SQLException ex) {
            Logger.getLogger(ModeloProducto.class.getName()).log(Level.SEVERE, null, ex);
     }
    ResultSet rs= ejecutarQuery(stam);
    try{
        if (rs.next()){
            setDescripcion(rs.getString("descripcion"));
            setId(rs.getInt("id"));
            setPrecio(rs.getFloat("precio"));
            setStatus(rs.getString("status"));
            setId_categoria(rs.getInt("id_categoria"));
            sw = true;
         }
    } catch (SQLException ex) {
        Logger.getLogger(ModeloProducto.class.getName()).log(Level.SEVERE, null, ex);
    }
    return sw;
  }

  public Vector<ModeloProducto> listar(){
    Vector<ModeloProducto> v = new Vector<ModeloProducto>();
    String sql="SELECT * FROM Producto WHERE status='A'";
    conectar();
    ResultSet rs= crearQuery(sql);
    try{
        while (rs.next()){
            ModeloProducto  i = new ModeloProducto();
            i.setDescripcion(rs.getString("descripcion"));
            i.setId(rs.getInt("id"));
            i.setPrecio(rs.getFloat("precio"));
            i.setStatus(rs.getString("status"));
            i.setId_categoria(rs.getInt("id_categoria"));
            v.add(i);
         }
    } catch (SQLException ex) {
        Logger.getLogger(ModeloProducto.class.getName()).log(Level.SEVERE, null, ex);
    }
    return v;
  }

  public Vector<String> listarIngredientesMasUsados(boolean tipoOrden){
    Vector<String> v = new Vector<String>();
    String sql="SELECT porciones , descripcion , id FROM  Ingrediente,(SELECT sum(porcion) AS porciones,id_ingrediente AS cod FROM IngredientexProducto where status='A' group by id_ingrediente) Suma where Ingrediente.id=Suma.cod ORDER BY porciones ";
    if(tipoOrden)
        sql+= "asc";
    else
        sql+= "desc";
    conectar();
    ResultSet rs= crearQuery(sql);
    try{
        while (rs.next())
            v.add(rs.getString("descripcion")+"|"+rs.getFloat("porciones")+"|"+rs.getInt("id"));
    } catch (SQLException ex) {
        Logger.getLogger(ModeloProducto.class.getName()).log(Level.SEVERE, null, ex);
    }
    return v;
  }

  public Vector<String> listarIngredientes(){
    Vector<String> v = new Vector<String>();
    conectar();
    String sql="SELECT Ingrediente.descripcion, IngredientexProducto.porcion  FROM Ingrediente, Producto,IngredientexProducto where Ingrediente.status='A' AND IngredientexProducto.status='A' AND Producto.status='A' AND Producto.id=IngredientexProducto.id_producto AND Ingrediente.id=IngredientexProducto.id_ingrediente AND Producto.id=?";
    PreparedStatement stam = crearPreparedStatement(sql);
    try {
        stam.setInt(1, id);
        ResultSet rs= ejecutarQuery(stam);
        while (rs.next())
            v.add(rs.getString(1)+"|"+rs.getFloat(2));
    } catch (SQLException ex) {
        Logger.getLogger(ModeloProducto.class.getName()).log(Level.SEVERE, null, ex);
    }
    return v;
  }

  public String verCategoria(){
    String sql="SELECT Categoria.descripcion FROM Categoria,Producto where Producto.status='A' AND Producto.id_categoria=Categoria.id AND Producto.id=?";
    conectar();
    PreparedStatement stam = crearPreparedStatement(sql);
    try{
        stam.setInt(1, getId());
    } catch (SQLException ex) {
        Logger.getLogger(ModeloIngrediente.class.getName()).log(Level.SEVERE, null, ex);
    }
    ResultSet rs =ejecutarQuery(stam);
    try{
        while (rs.next())
            return rs.getString(1);
    } catch (SQLException ex) {
        Logger.getLogger(ModeloProducto.class.getName()).log(Level.SEVERE, null, ex);
    }
    return null;
  }

  
  public Vector<String> listarVentas(boolean tipoOrden){
    Vector<String> v = new Vector<String>();
    String sql="SELECT descripcion, (precio*Suma.cantidad), Suma.cantidad as cantidad FROM  Producto, (select sum(ProductoxOrden.cantidad) as cantidad, ProductoxOrden.id_producto as idSuma from ProductoxOrden where status='A' group by ProductoxOrden.id_producto) Suma where Suma.idSuma=id and status='A' order by(cantidad,(precio*Suma.cantidad))";
    if(tipoOrden)
        sql+= "asc";
    else
        sql+= "desc";
    conectar();
    ResultSet rs= crearQuery(sql);
    try{
        while (rs.next())
            v.add(rs.getString("descripcion")+"|"+rs.getFloat(2)+"|"+rs.getInt(3));
    } catch (SQLException ex) {
        Logger.getLogger(ModeloProducto.class.getName()).log(Level.SEVERE, null, ex);
    }
    return v;
  }

   public boolean verificarStock(String descripcion){
    Vector<ModeloProducto> v = new Vector<ModeloProducto>();
    Vector<ModeloIngrediente> vI = new Vector<ModeloIngrediente>();
    Vector<Float> f = new Vector<Float>();
    String sql="select Ingrediente.id,IngredientexProducto.porcion from  Ingrediente,IngredientexProducto,Producto where Ingrediente.status='A' and IngredientexProducto.status='A' and Producto.status='A' and Producto.id=IngredientexProducto.id_producto and Producto.id=?";
    conectar();
    PreparedStatement stam = crearPreparedStatement(sql);
    try{
        stam.setInt(1, getId());
    } catch (SQLException ex) {
        Logger.getLogger(ModeloIngrediente.class.getName()).log(Level.SEVERE, null, ex);
    }
    ResultSet rs =ejecutarQuery(stam);
    try {
         while(rs.next()){
            ModeloIngrediente  i = new ModeloIngrediente();
            i.setId(rs.getInt(1));
            f.add(rs.getFloat(2));
            vI.add(i);
         }
     } catch (SQLException ex) {
            Logger.getLogger(ModeloIngrediente.class.getName()).log(Level.SEVERE, null, ex);
     }
     desconectar();
     for (int i = 0; i < vI.size(); i++)
         if(!(vI.elementAt(i).verificarStock(f.elementAt(i)))){
             descripcion= new String(vI.elementAt(i).getDescripcion());
             return false;
         }
     return true;
  }

 public void actualizarStock(){
    Vector<ModeloProducto> v = new Vector<ModeloProducto>();
    Vector<ModeloIngrediente> vI = new Vector<ModeloIngrediente>();
    Vector<Float> f = new Vector<Float>();
    String sql="select Ingrediente.id,IngredientexProducto.porcion from  Ingrediente,IngredientexProducto,Producto where Ingrediente.status='A' and IngredientexProducto.status='A' and Producto.status='A' and Ingrediente.id=IngredientexProducto.id_ingrediente and Producto.id=IngredientexProducto.id_producto and Producto.id=?";
    conectar();
    PreparedStatement stam = crearPreparedStatement(sql);
    try{
        stam.setInt(1, getId());
    } catch (SQLException ex) {
        Logger.getLogger(ModeloIngrediente.class.getName()).log(Level.SEVERE, null, ex);
    }
    ResultSet rs =ejecutarQuery(stam);
    try {
         while(rs.next()){
            ModeloIngrediente  i = new ModeloIngrediente();
            i.setId(rs.getInt(1));
            f.add(rs.getFloat(2));
            vI.add(i);
         }
     } catch (SQLException ex) {
            Logger.getLogger(ModeloIngrediente.class.getName()).log(Level.SEVERE, null, ex);
     }
     desconectar();
     for (int i = 0; i < vI.size(); i++){
        vI.elementAt(i).consultar();
         vI.elementAt(i).actualizarStock(f.elementAt(i));
     }
  }

    public String getDescripcion() {
        return descripcion;
    }

    public void setDescripcion(String descripcion) {
        this.descripcion = descripcion;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public int getId_categoria() {
        return id_categoria;
    }

    public void setId_categoria(int id_categoria) {
        this.id_categoria = id_categoria;
    }

    public float getPrecio() {
        return precio;
    }

    public void setPrecio(float precio) {
        this.precio = precio;
    }

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }


}
